home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (DO) / Peeker Nr. 15 (1986)(Verlag, Dr. Alfred Huethig)(DE).zip / Peeker Nr. 15 (1986)(Verlag, Dr. Alfred Huethig)(DE).do / T.MAKESUB.s < prev   
Text File  |  1996-12-24  |  18KB  |  605 lines

  1. *-----------------------------*
  2. *          MAKESUB            *
  3. *   von Arne Sch{pers, 1985   *
  4. *-----------------------------*
  5. *
  6. PTR       EQU $06        ; ($07)
  7. PROMPT    EQU $33        ; f}r GETLIN
  8. COUTV     EQU $36        ; I/O-Vektoren
  9. *
  10. PATH      EQU $280       ; interner Pathname
  11. *
  12. RESTART   EQU $3D3       ; (Pro)DOS-Warmstart
  13. *
  14. * Monitor-Routinen:
  15. *
  16. HOME      EQU $FC58
  17. GETKEY    EQU $FD0C      ; GET ein Zeichen
  18. GETLIN    EQU $FD6F      ; GET eine Zeile
  19. PRBYTE    EQU $FDDA      ; Print Akku in Hex
  20. COUT      EQU $FDED      ; PRINT
  21. *
  22.           ORG $803
  23. *
  24.           LDX #03
  25. DISCONN   LDA $BE30,X    ; BASIC.SYSTEM ab!
  26.           STA COUTV,X
  27.           DEX
  28.           BPL DISCONN
  29. *
  30.           JSR HOME
  31.           LDX #0
  32.           JSR PRT1       ; "Erstellung von..."
  33.           INX
  34.           JSR PRTMSG     ; "Eingabe Filename: "
  35.           LDA #$BA
  36.           STA PROMPT     ; ":"
  37.           JSR GETLIN
  38.           JSR SETPATH    ; Path + PREFIX => $280
  39. GETNUM    LDX #GETLEN-MSGS
  40.           JSR PRTMSG     ; "Block-Anzahl: "
  41.           JSR GETLIN
  42.           JSR SETNUM     ; ASCII => Hex
  43.           BCS GETNUM     ; illegale Zeichen: Loop
  44.           LDX #START-MSGS
  45.           JSR PRTMSG     ; "<CR>=Start, <ESC>..."
  46. GETSTART  JSR GETKEY
  47.           CMP #$8D       ; <CR>?
  48.           BEQ GOTSTART
  49.           CMP #$9B       ; <ESC>?
  50.           BNE GETSTART
  51.           JMP EXIT       ; Abbruch
  52. *
  53. GOTSTART  LDA BLWANT+1   ; Anzahl gew}nschte
  54.           LDY BLWANT     ; Blocks =>
  55.           STA BLNEED+1   ; Anzahl ben|tigte
  56.           STY BLNEED     ; Blocks
  57.           LSR EXISTS     ; Flag zur}ck
  58.           JSR TSTFILE    ; sucht das SubDIR via MLI
  59.           BEQ TSTROOM    ; nicht gefunden
  60.           CMP #$00       ; SubDIR existiert?
  61.           BEQ TSTTYPE
  62.           JMP NOVOL      ; nein, PATH NOT FOUND
  63. TSTTYPE   LDA #$80
  64.           STA EXISTS     ; Flag setzen
  65.           LDA STYPE      ; aus TSTFILE, FILE INFO
  66.           CMP #$0D       ; ist SubDIR?
  67.           BEQ SETNEED
  68.           JMP BADTYPE    ; "FILE TYPE MISMATCH"
  69. SETNEED   LDA BLNEED     ; SubDIR existiert:
  70.           SEC            ; die Anzahl der
  71.           SBC BLUSED     ; ben|tigten Blocks
  72.           STA BLNEED     ; wird entsprechend
  73.           LDA BLNEED+1   ; heruntergesetzt
  74.           SBC BLUSED+1
  75.           STA BLNEED+1
  76.           BCC TOOLONG    ; USED > NEEDED!
  77.           ORA BLNEED     ; zus{tzliche Blocks
  78.           BNE TSTROOM    ; = 00 00?
  79.           JMP DONE       ; nichts zu tun...
  80. TOOLONG   JMP BADLEN     ; "SET EOF?"
  81. *
  82. TSTROOM   JSR GETROOM    ; GET F'INFO VolDIR
  83.           BCS ROOMOK     ; und Test BLOCKS_FREE
  84.           JMP NOROOM     ; "VOLUME FULL"
  85. *
  86. ROOMOK    LDA $BF30      ; "last used Unit"
  87.           STA RWUNIT     ; f}r BLOCKREAD/WRITE
  88.           BIT EXISTS
  89.           BMI SETENTRY
  90.           JSR MAKEDIR    ; neues DIR CREATE
  91.           JSR DECNEED    ; BLOCKS_NEEDED-1
  92.           BNE SETENTRY   ; bleiben noch Blocks
  93.           JMP DONE       ; fertig
  94. *
  95. SETENTRY  JSR GETFILE    ; sucht SubDIR und setzt
  96.           LDY #$13       ; PTR auf File-Eintrag
  97.           LDA BLWANT     ; f}r das SubDIR
  98.           STA (PTR),Y
  99.           INY
  100.           LDA BLWANT+1   ; BLOCKS_USED im
  101.           STA (PTR),Y    ; File-Eintrag
  102.           INY
  103.           INY
  104.           LDA BLWANT     ; EOF des SubDIR
  105.           ASL            ; => BLOCKS * $200
  106.           STA (PTR),Y    ; und wird gesetzt
  107.           INY
  108.           LDA BLWANT+1
  109.           ROL
  110.           STA (PTR),Y    ; EOF, h|chstes Byte
  111.           JSR MLIWRITE   ; schreibt DIR zur}ck
  112. *
  113.           JSR SETBLOCK1  ; setzt 1.Block aus Eintrag
  114. GETDEND   JSR RDBLOCK    ; liest ersten/n{chsten
  115.           LDA DIRBUF+2   ; Block des SubDIR
  116.           TAY            ; nach DIRBUF
  117.           ORA DIRBUF+3   ; FORWARD REF = 00 00?
  118.           BEQ APPEND     ; ja, SubDIR jetzt zu Ende
  119.           LDA DIRBUF+3
  120.           JMP GETDEND    ; geht noch weiter
  121. *
  122. APPEND    JSR READVBM    ; 1.VBM-Block nach VBMBUF
  123.           BEQ SETLINK    ; "always"
  124. *
  125. NEWBLOCK  LDA RWBLOCK+1  ; Vorbereiten eines
  126.           LDY RWBLOCK    ; neuen SubDIR-Blocks:
  127.           STA DIRBUF+1   ; die Nummer des zuletzt
  128.           STY DIRBUF+0   ; gelesenen Blocks wird
  129.           LDA DIRBUF+3   ; als BACKWARD REF,
  130.           LDY DIRBUF+2   ; die alte FORWARD REF
  131.           STA RWBLOCK+1  ; als n{chste Blocknummer
  132.           STY RWBLOCK    ; f}r WRITE eingetragen
  133. *
  134.           LDX #0         ; danach wird der
  135.           TXA            ; neue Block gel|scht,
  136. CLRBLOCK  STA DIRBUF+2,X
  137.           STA DIRBUF+$100,X
  138.           INX            ; bis auf die Bytes 00
  139.           BNE CLRBLOCK   ; und 01 (BACKWARD REF)
  140. *
  141. NXTLINK   JSR DECNEED    ; BLNEED-1
  142.           BEQ LINK00     ; => letzter Block
  143. SETLINK   JSR GNBLOCK    ; nein, n{chster Block
  144.           STA DIRBUF+3   ; wird belegt und als
  145.           STY DIRBUF+2   ; FOWARD REF eingetragen
  146. LINK00    JSR MLIWRITE   ; schreibt den Block
  147.           JSR TSTNEED    ; noch weitere Blocks?
  148.           BNE NEWBLOCK
  149.           JSR WRITEVBM   ; VBM zur}ckschreiben
  150. *
  151. DONE      LDX #DONMSG-MSGS
  152.           JSR PRTMSG     ; "- Fertig."
  153.           JMP EXIT
  154. *
  155. DECNEED   LDA BLNEED     ; setzt BLOCKS_NEEDED
  156.           SEC            ; um eins herunter und
  157.           SBC #01        ; pr}ft, ob noch
  158.           STA BLNEED     ; weitere Blocks
  159.           BCS TSTNEED    ; anzuh{ngen sind
  160.           DEC BLNEED+1
  161. TSTNEED   LDA BLNEED+1
  162.           ORA BLNEED     ; beide auf 00?
  163.           RTS
  164. *
  165. EXISTS    DS 1           ; <$80, wenn SubDIR neu
  166. *
  167. BLWANT    DS 2           ; BLOCKS_WANTED
  168. BLNEED    DS 2           ; BLOCKS_NEEDED
  169. *
  170. ************************
  171. *
  172. SETPATH   LDX #00
  173.           LDA $0200,X
  174.           AND #$7F       ; Start des Path
  175.           CMP #'/'       ; mit "/"?
  176.           BEQ GOTPATH
  177.           JSR $BF00      ; ansonsten
  178.           DFB $C7        ; GET PREFIX
  179.           DA PFXLIST
  180.           BEQ GOTPFX     ; "always"!
  181. PFXLIST   DFB 01         ; 1 Parameter
  182.           DA PATH-1      ; Ziel: $027F
  183. *
  184. GOTPFX    LDX PATH-1     ; Gesamtl{nge
  185. GOTPATH   LDY #00
  186. COPYPATH  LDA $0200,Y    ; Path wird von $200
  187.           AND #$7F       ; nach PATH kopiert
  188.           CMP #$0D       ; Path-Ende?
  189.           BEQ PATHSET
  190.           CMP #$60       ; Kleinbuchstabe?
  191.           BCC ISUC
  192.           AND #$5F       ; Umwandlung in gro~
  193. ISUC      STA PATH,X     ; bzw. an das PREFIX
  194.           INX            ; angeh{ngt
  195.           INY
  196.           BNE COPYPATH
  197. PATHSET   STX PATH-1     ; Gesamtl{nge
  198.           RTS
  199. *
  200. SETNUM    LDX #00        ; wandelt ASCII-Hexstring
  201.           STX BLWANT     ; in BLOCKS_WANTED um
  202.           STX BLWANT+1
  203. NXTNUM    LDA $0200,X
  204.           CMP #$8D       ; <CR>?
  205.           BEQ NUMSET     ; Zahl zu Ende
  206.           CMP #$E0
  207.           BCC ISCAPS
  208.           AND #$DF       ; Umwandlung in gro~
  209. ISCAPS    LDY #04
  210.           SEC
  211.           SBC #$B0       ; minus "0"
  212.           BCC BADNUM     ; keine Zahl
  213.           CMP #$0A
  214.           BCC ISNUM      ; "0".."9"
  215.           SBC #$07
  216.           CMP #$10       ; "A".."F"?
  217.           BCS BADNUM     ; nein
  218. ISNUM     ASL BLWANT     ; alte Zahl * 16
  219.           ROL BLWANT+1
  220.           DEY
  221.           BNE ISNUM
  222.           ORA BLWANT     ; neue Zahl dazu
  223.           STA BLWANT
  224.           INX
  225.           BNE NXTNUM
  226. *
  227. NUMSET    LDA BLWANT
  228.           ORA BLWANT+1   ; Zahl > 00 00?
  229.           BEQ BADNUM
  230.           CLC
  231.           RTS
  232. BADNUM    SEC
  233.           RTS
  234. *
  235. TSTFILE   JSR $BF00      ; GET FILE INFO
  236.           DFB $C4        ; f}r das neue SubDIR
  237.           DA INFOLIST
  238.           CMP #$46       ; FILE NOT FOUND?
  239.           BEQ TSTEND
  240.           CMP #$00       ; File gefunden?
  241.           BEQ TSTZ       ; ja, ist auch o.k.
  242.           SBC #$44       ; Fehler im
  243.           CMP #$02       ; Bereich $44-45?
  244.           BCC TSTZ       ; ja, PATH NOT FOUND
  245.           ADC #$43       ; => ERR# f}r MLIERR
  246.           JMP MLIERR
  247. TSTZ      LDY #$FF       ; l|scht Z-Flag
  248. TSTEND    RTS
  249. *
  250. GETROOM   LDA PATH-1     ; Gesamtl{nge des
  251.           PHA            ; Path speichern
  252.           LDX #00
  253. GETVDIR   INX            ; und nur das VolDIR
  254.           LDA PATH,X     ; herausholen
  255.           CMP #'/'       ; Ende erster Name?
  256.           BNE GETVDIR
  257.           STX PATH-1     ; nur VolDIR-Name
  258.           JSR $BF00
  259.           DFB $C4        ; GET FILE INFO
  260.           DA INFOLIST    ; f}r VolDIR
  261.           BEQ GOTVDIR
  262.           JMP MLIERR     ; "MLI-Fehler: $xx"
  263. GOTVDIR   PLA
  264.           STA PATH-1     ; RESTORE des Path
  265.           LDA AUXRTN     ; TOTAL_BLOCKS auf
  266.           SEC            ; dem Volume minus
  267.           SBC BLUSED     ; belegte Blocks auf
  268.           TAX            ; dem Volume ergibt
  269.           LDA AUXRTN+1   ; BLOCKS_FREE
  270.           SBC BLUSED+1
  271.           CMP BLNEED+1   ; ben|tigte Blocks
  272.           BCC ROOMGOT    ; kein Platz!
  273.           BNE ROOMGOT    ; o.k.
  274.           CPX BLNEED
  275. ROOMGOT   RTS            ; C = 0, => kein Platz
  276. *
  277. INFOLIST  DFB $0A        ; 10 Parameter
  278.           DA PATH-1      ; Pathname
  279.           DS 2           ; ACCESS, File Type
  280. AUXRTN    DS 2           ; AUX_INFO
  281. STYPE     DS 1           ; Storage Type
  282. BLUSED    DS 2           ; BLOCKS_USED
  283.           DS 8           ; DATE & TIME
  284. *
  285. MAKEDIR   JSR $BF00
  286.           DFB $C0        ; CREATE des SubDIR
  287.           DA CRLIST
  288.           BEQ MKDONE
  289.           JMP MLIERR
  290. MKDONE    RTS
  291. *
  292. CRLIST    DFB $07        ; 7 Parameter
  293.           DA PATH-1      ; Pathname
  294.           DFB $C3        ; ACCESS
  295.           DFB $0F        ; File Type: DIR
  296.           DA $0000       ; AUX_TYPE
  297.           DFB $0D        ; Storage Type: SubDIR
  298.           DFB 0,0,0,0    ; DATE & TIME
  299. *
  300. GETFILE   LDX PATH-1     ; Gesamtl{nge
  301. RPL1      LDY #$FF
  302. RPL2      DEX            ; der Path wird von
  303.           BMI SCANDIRS   ; "/xxx/yyyy" in
  304.           INY            ; die Form:
  305.           LDA PATH,X     ; <03>xxx<04>yyyy
  306.           CMP #'/'       ; }berf}hrt, d.h.
  307.           BNE RPL2       ; alle "/" im Path
  308.           TYA            ; werden durch L{ngen-
  309.           STA PATH,X     ; bytes ersetzt
  310.           BNE RPL1
  311. *
  312. SCANDIRS  LDX PATH+0     ; Start mit dem zweiten
  313.           INX            ; Namen im Path
  314.           STX PATHIDX    ; (nach dem VolDIR)
  315.           LDY #$02       ; und dem ersten Block
  316.           LDA #$00       ; des VolDIR
  317.           JSR RDBLOCK    ; READ Block $0002
  318.           LDA DIRBUF+$28
  319.           LDY DIRBUF+$27
  320.           STA VBMNO+1    ; Blocknummer des
  321.           STY VBMNO      ; ersten VBM-Blocks
  322. *
  323. DIRSET    LDX #$80       ; Flag: erster Block
  324.           STX BLOCK1     ; wird gesetzt
  325. DOSCAN    JSR SCAN       ; sucht nach Path-Namen
  326.           BCC NXTDIR     ; dieser Name gefunden
  327.           LDA DIRBUF+3   ; FORWARD REF: Setzen
  328.           LDY DIRBUF+2   ; des n{chsten DIR-Blocks
  329.           JSR RDBLOCK    ; liest den Block
  330.           BEQ DOSCAN     ; "always"
  331. *
  332. NXTDIR    LDX PATHIDX    ; war dieser Name
  333.           TXA            ; der letzte im Path?
  334.           SEC
  335.           ADC PATH,X     ; Index auf n{chsten Namen
  336.           CMP PATH-1     ; = Gesamtl{nge?
  337.           BCS GOTFILE
  338.           STA PATHIDX    ; nein, n{chster Name
  339.           JSR SETBLOCK1  ; im Path. Der erste Block
  340.           JSR RDBLOCK    ; des hier gefundenen DIR
  341.           BEQ DIRSET     ; wird gelesen => Loop
  342. GOTFILE   RTS            ; mit PTR auf neues SubDIR
  343. *
  344. SCAN      LDA #>DIRBUF   ; sucht einen DIR-Block
  345.           STA PTR+1      ; nach einem Namen
  346.           LDA #$04       ; im Path als File-Eintrag ab
  347.           CLC
  348.           BIT BLOCK1     ; erster Block dieses DIR?
  349.           BPL NOT1ST     ; nein
  350.           LDY DIRBUF+$24
  351.           STY ENUMBER    ; Eintr{ge pro Block
  352.           LDY DIRBUF+$23
  353.           STY ELENGTH    ; L{nge eines Eintrags
  354.           ADC ELENGTH    ; HEADER }berspringen
  355.           LSR BLOCK1     ; Flag zur}ck
  356. *
  357. NOT1ST    LDY ENUMBER    ; Eintr{ge/Block
  358.           STY ECOUNT     ; Herunterz{hler
  359. *
  360. NXTENTRY  STA PTR
  361.           LDA PTR+1      ; PTR auf ersten/
  362.           ADC #00        ; n{chsten Eintrag
  363.           STA PTR+1      ; im Block
  364.           JSR CMPNAME    ; vergleicht Eintrag & Path
  365.           BCC GOTNAME    ; gefunden!
  366.           DEC ECOUNT     ; noch Eintr{ge }brig?
  367.           BEQ NOTFOUND   ; nein, Block-Ende
  368.           LDA PTR
  369.           CLC            ; PTR auf n{chsten Eintrag
  370.           ADC ELENGTH
  371.           JMP NXTENTRY
  372. *
  373. NOTFOUND  SEC
  374. GOTNAME   RTS
  375. *
  376. CMPNAME   LDY #00
  377.           LDX PATHIDX    ; Index zum momentanen Namen
  378.           LDA (PTR),Y    ; 1.Byte v. File-Eintrag
  379.           AND #$0F       ; => Namensl{nge
  380.           CMP PATH,X     ; = Path-Name?
  381.           BNE NOTSAME
  382.           TAY
  383.           CLC
  384.           ADC PATHIDX    ; Start des Vergleichs
  385.           TAX            ; von hinten
  386. CMP1      LDA (PTR),Y
  387.           CMP PATH,X
  388.           BNE NOTSAME
  389.           DEX
  390.           DEY
  391.           BNE CMP1
  392.           CLC            ; Namen sind gleich
  393.           RTS
  394. NOTSAME   SEC
  395.           RTS
  396. *
  397. SETBLOCK1 LDY #$12       ; holt die Nummer
  398.           LDA (PTR),Y    ; des ersten Blocks
  399.           PHA            ; im File aus dem
  400.           DEY            ; File-Eintrag nach
  401.           LDA (PTR),Y    ; A-Y
  402.           TAY
  403.           PLA
  404.           RTS
  405. *
  406. PATHIDX   DS 1           ; Index in PATH
  407. BLOCK1    DS 1           ; Flag: $80, wenn 1.DIR-Block
  408. ENUMBER   DS 1           ; Anzahl Eintr{ge/DIR-Block
  409. ELENGTH   DS 1           ; L{nge eines Eintrags
  410. ECOUNT    DS 1           ; Herunterz{hler im DIR-Block
  411. *
  412. RDBLOCK   STA RWBLOCK+1  ; Aufruf mit
  413.           STY RWBLOCK    ; Blocknr. in A-Y
  414.           JSR $BF00
  415.           DFB $80        ; READ BLOCK
  416.           DA RWLIST
  417.           BEQ RWDONE
  418.           JMP MLIERR     ; "MLI-Fehler: $xx"
  419. *
  420. RWLIST    DFB $03        ; 3 Parameter
  421. RWUNIT    DS 1           ; Unit-Nummer
  422.           DA DIRBUF      ; Ziel/Quelle: DIRBUF
  423. RWBLOCK   DS 2           ; Blocknummer
  424. *
  425. MLIWRITE  JSR $BF00
  426.           DFB $81        ; WRITE BLOCK
  427.           DA RWLIST      ; Blocknr. ist gesetzt!
  428.           BEQ RWDONE
  429.           JMP MLIERR     ; "MLI-Fehler: $xx"
  430. RWDONE    RTS
  431. *
  432. READVBM   LDA #00
  433.           STA EXTENT     ; VBM-Block Nummer 1
  434.           STA ALTERED    ; "unver{ndert"
  435. *
  436. GETVBM    LDA VBMNO      ; Nummer 1.VBM-Block
  437.           CLC
  438.           ADC EXTENT     ; "x-ter" VBM-Block
  439.           STA VBLOCK
  440.           LDA VBMNO+1
  441.           ADC #00
  442.           STA VBLOCK+1   ; Blocknummer Hi
  443.           LDA RWUNIT
  444.           STA VUNIT      ; Unit-Nummer
  445. *
  446.           JSR $BF00
  447.           DFB $80        ; READ BLOCK
  448.           DA VBMLIST
  449.           BEQ GOTVBM
  450.           JMP MLIERR     ; "MLI-Fehler: $xx"
  451. *
  452. WRITEVBM  BIT ALTERED    ; "ver{ndert"?
  453.           BPL GOTVBM     ; nein, kein REWRITE
  454.           LSR ALTERED    ; sonst Flag zur}ck
  455.           JSR $BF00
  456.           DFB $81        ; BLOCK WRITE
  457.           DA VBMLIST
  458.           BEQ GOTVBM
  459.           JMP MLIERR     ; "MLI-Fehler: $xx"
  460. *
  461. GOTVBM    RTS
  462. *
  463. VBMLIST   DFB $03        ; 3 Parameter
  464. VUNIT     DS 1           ; Unit-Nummer
  465.           DA VBMBUF      ; Ziel/Quelle: VBMBUF
  466. VBLOCK    DS 2           ; Blocknummer
  467. *
  468. EXTENT    DS 1           ; "x-ter" VBM-Block
  469. PAGE      DS 1           ; Seite im VBM-Block
  470. INBYTE    DS 1           ; Index in einem VBM-Byte
  471. *
  472. ALTERED   DS 1           ; $80: VBM-Block ver{ndert
  473. VBMNO     DS 2           ; Blocknr. 1. VBM-Block
  474. *
  475. GNBLOCK   LDY #00        ; belegt den n{chsten
  476.           STY PAGE       ; freien Block und returnt
  477.           STY PTR        ; Blocknr. in A-Y
  478.           LDA #>VBMBUF   ; Adresse Hi
  479.           STA PTR+1
  480. *
  481. TSTBYTE   LDA (PTR),Y
  482.           BNE GETBIT     ; mindestens 1 Block frei!
  483.           INY
  484.           BNE TSTBYTE
  485.           INC PTR+1
  486.           INC PAGE       ; Speicherseite-Z{hler,
  487.           LDA PAGE       ; wird f}r Bestimmung der
  488.           CMP #02        ; Blocknr. ben|tigt
  489.           BCC TSTBYTE
  490. *
  491.           JSR WRITEVBM   ; REWRITE dieses VBM-Blocks
  492.           INC EXTENT     ; n{chster VBM-Block
  493.           JSR READVBM
  494.           BEQ GNBLOCK    ; => Loop
  495. *
  496. GETBIT    LDX #0         ; holt ein gesetztes
  497. GETB1     ROL            ; Bit aus dem Akku
  498.           BCS GOTBIT     ; und z{hlt dabei mit
  499.           INX
  500.           BNE GETB1
  501. GOTBIT    STX INBYTE     ; 0..7: Nummer des Bits
  502.           CLC            ; dieses Bit l|schen!
  503. GOTB1     ROR            ; und Restore des Akku
  504.           DEX
  505.           BPL GOTB1
  506. *
  507.           STA (PTR),Y    ; Block belegt in VBM
  508.           LDA #$80       ; dieser VBM-Block mu~
  509.           STA ALTERED    ; zur}ckgeschrieben werden
  510. *
  511.           LDA EXTENT     ; "x-ter" VBM-Block:
  512.           ASL            ; Blocknummer * $1000
  513.           ORA PAGE       ; "Seite" darin:
  514.           STA BLOCKHI    ; Blocknummer * $800
  515.           TYA            ; Index in der Seite:
  516.           LDY #03        ; Blocknummer * $08
  517. X8        ASL
  518.           ROL BLOCKHI    ; insgesamt * 8
  519.           DEY
  520.           BNE X8
  521.           ORA INBYTE     ; + 0...7
  522.           TAY            ; Blocknummer Low
  523.           LDA BLOCKHI
  524.           RTS
  525. *
  526. BLOCKHI   DS 1           ; Scratch: Blocknr. Hi
  527. *
  528. ************
  529. *---EXIT---*
  530. ************
  531. *
  532. EXIT      LDA #$8D
  533.           JSR COUT       ; 2mal <CR>
  534.           JSR COUT
  535.           LDA #$00
  536.           STA $48        ; ???
  537.           JMP RESTART    ; DOS-Warmstart
  538. *
  539. MLIERR    PHA            ; Fehlernummer
  540.           LDX #DSKERR-MSGS
  541.           JSR PRTERR     ; "MLI-Fehler: $"
  542.           PLA
  543.           JSR PRBYTE     ; ERR# in Hex
  544.           JMP EXIT
  545. *
  546. BADTYPE   LDX #BADTXT-MSGS
  547.           BNE SETERR     ; "FILE TYPE MISMATCH"
  548. *
  549. BADLEN    LDX #LENTXT-MSGS
  550.           BNE SETERR     ; "Verk}rzung ..."
  551. *
  552. NOVOL     LDX #BADVOL-MSGS
  553.           BNE SETERR     ; "PATH NOT FOUND"
  554. *
  555. NOROOM    LDX #VOLFULL-MSGS
  556. *
  557. SETERR    JSR PRTERR
  558.           JMP EXIT
  559. *
  560. PRTERR    LDA #$87       ; BELL
  561.           JSR COUT
  562. *
  563. PRTMSG    LDA #$8D       ; 2mal <CR>
  564.           JSR COUT
  565.           JSR COUT
  566. PRT1      LDA MSGS,X
  567.           BEQ PRDONE     ; <00>: Text-Ende
  568.           ORA #$80
  569.           JSR COUT
  570.           INX
  571.           BNE PRT1       ; "always"
  572. PRDONE    RTS
  573. *
  574. MSGS      ASC 'Erstellung von Subdirectories'
  575.           DFB $8D,$8D
  576.           ASC 'mit definierter Block-Anzahl'
  577.           DFB $8D,$8D,00
  578.           ASC 'Eingabe Filename: '
  579.           DFB 00
  580. *
  581. GETLEN    ASC 'Block-Anzahl (Hex): '
  582.           DFB 00
  583. *
  584. START     ASC '<CR>=Start  <ESC>=Abbruch'
  585.           DFB 00
  586. *
  587. DONMSG    ASC '- Fertig.'
  588.           DFB 00
  589. *
  590. DSKERR    ASC 'MLI-Fehler: $'
  591.           DFB 00
  592. BADTXT    ASC 'FILE TYPE MISMATCH'
  593.           DFB 00
  594. LENTXT    ASC 'Verk}rzung nicht m|glich!'
  595.           DFB 00
  596. BADVOL    ASC 'PATH NOT FOUND'
  597.           DFB 00
  598. VOLFULL   ASC 'VOLUME FULL'
  599.           DFB 00
  600. *
  601. DIRBUF    EQU $1000
  602. VBMBUF    EQU DIRBUF+$200
  603.           LST OFF
  604.  
  605.